package vista;

import java.util.LinkedList;
import java.util.ListIterator;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JLayeredPane;
import javax.swing.LayoutStyle.ComponentPlacement;

import vista.pasos.FiltroPrecio;
import vista.pasos.Paso;
import vista.pasos.Paso1;
import vista.pasos.Paso2;
import vista.pasos.Paso3;
import vista.pasos.Paso4;
import vista.pasos.Paso5;
import vista.pasos.Paso6;
import vista.pasos.Paso7;
import vista.pasos.Paso8;
import vista.pasos.Paso9;
import vista.pasos.Resultado;
import controlador.Controlador;

@SuppressWarnings("serial")
public class VentanaPrincipal extends javax.swing.JFrame {

	private static final String TITULO_APP = "Selector de PCs";
	private static final String TEXTO_SIGUIENTE = "Siguiente";
	private static final String TEXTO_ANTERIOR = "Anterior";
	
	private LinkedList<Paso> pasos = new LinkedList<Paso>();
	private ListIterator<Paso> iteradorPasos;
	private Paso pasoActivo;
	private JLayeredPane panel;
	private JButton btnSiguiente;
	private JButton btnAnterior;
	
	private Paso1 paso1 = new Paso1();
	private Paso2 paso2 = new Paso2();
	private Paso3 paso3 = new Paso3();
	private Paso4 paso4 = new Paso4();
	private Paso5 paso5 = new Paso5();
	private Paso6 paso6 = new Paso6();
	private Paso7 paso7 = new Paso7();
	private Paso8 paso8 = new Paso8();
	private Paso9 paso9 = new Paso9();
	private FiltroPrecio filtroPrecio = new FiltroPrecio();
	private Resultado resultado = new Resultado();
	
	
	public VentanaPrincipal() {
		initComponents();
		inicializarPasos();
		getRootPane().setDefaultButton(btnSiguiente);
	}

	private void inicializarPasos() {
		pasos.add(paso1);
		pasos.add(paso2);
		pasos.add(paso3);
		pasos.add(paso4);
		pasos.add(paso5);
		pasos.add(paso6);
		pasos.add(paso7);
		pasos.add(paso8);
		pasos.add(paso9);
		pasos.add(filtroPrecio);
		pasos.add(resultado);
		
		iteradorPasos = (ListIterator<Paso>) pasos.iterator();
		pasoActivo = iteradorPasos.next();
		btnAnterior.setVisible(pasoActivo.tieneAnterior());
		btnSiguiente.setVisible(pasoActivo.tieneSiguiente());
	}

	private void initComponents() {
		setTitle(TITULO_APP);
		btnSiguiente = new javax.swing.JButton();
		btnAnterior = new javax.swing.JButton();
		panel = new javax.swing.JLayeredPane();

		setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

		btnSiguiente.setText(TEXTO_SIGUIENTE);
		btnAnterior.setText(TEXTO_ANTERIOR);
	
		btnSiguiente.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				btnSiguienteActionPerformed(evt);
			}
		});
		
		btnAnterior.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				btnAnteriorActionPerformed(evt);
			}
		});
        
		paso1.setName("paso1");
        paso1.setBounds(0, 0, 444, 279);
        panel.add(paso1, javax.swing.JLayeredPane.DEFAULT_LAYER);
        
        paso2.setName("paso2");
        paso2.setBounds(0, 0, 444, 279);
        panel.add(paso2, javax.swing.JLayeredPane.DEFAULT_LAYER);
        
        paso3.setName("paso3");
        paso3.setBounds(0, 0, 444, 279);
        panel.add(paso3, javax.swing.JLayeredPane.DEFAULT_LAYER);
        
        paso4.setName("paso4");
        paso4.setBounds(0, 0, 444, 279);
        panel.add(paso4, javax.swing.JLayeredPane.DEFAULT_LAYER);
        
        paso5.setName("paso5");
        paso5.setBounds(0, 0, 444, 279);
        panel.add(paso5, javax.swing.JLayeredPane.DEFAULT_LAYER);
        
        paso6.setName("paso6");
        paso6.setBounds(0, 0, 444, 279);
        panel.add(paso6, javax.swing.JLayeredPane.DEFAULT_LAYER);
        
        paso7.setName("paso7");
        paso7.setBounds(0, 0, 444, 279);
        panel.add(paso7, javax.swing.JLayeredPane.DEFAULT_LAYER);
        
        paso8.setName("paso8");
        paso8.setBounds(0, 0, 444, 279);
        panel.add(paso8, javax.swing.JLayeredPane.DEFAULT_LAYER);
        
        paso9.setName("paso9");
        paso9.setBounds(0, 0, 444, 279);
        panel.add(paso9, javax.swing.JLayeredPane.DEFAULT_LAYER);
        
        filtroPrecio.setName("filtroPrecio");
        filtroPrecio.setBounds(0, 0, 444, 279);
        filtroPrecio.setVisible(false);
        panel.add(filtroPrecio, javax.swing.JLayeredPane.DEFAULT_LAYER);
        
        resultado.setName("resultado");
        resultado.setBounds(0, 0, 444, 279);
        panel.add(resultado, javax.swing.JLayeredPane.DEFAULT_LAYER);
        
		javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
		layout.setHorizontalGroup(
			layout.createParallelGroup(Alignment.LEADING)
				.addGroup(layout.createSequentialGroup()
					.addGroup(layout.createParallelGroup(Alignment.LEADING)
						.addGroup(layout.createSequentialGroup()
							.addGap(283)
							.addComponent(btnAnterior)
							.addPreferredGap(ComponentPlacement.RELATED)
							.addComponent(btnSiguiente))
						.addGroup(layout.createSequentialGroup()
							.addContainerGap()
							.addComponent(panel, GroupLayout.PREFERRED_SIZE, 444, GroupLayout.PREFERRED_SIZE)))
					.addContainerGap(0, Short.MAX_VALUE))
		);
		layout.setVerticalGroup(
			layout.createParallelGroup(Alignment.LEADING)
				.addGroup(layout.createSequentialGroup()
					.addComponent(panel, GroupLayout.PREFERRED_SIZE, 279, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addGroup(layout.createParallelGroup(Alignment.BASELINE)
						.addComponent(btnAnterior)
						.addComponent(btnSiguiente))
					.addContainerGap(0, Short.MAX_VALUE))
		);
		
		getContentPane().setLayout(layout);

		pack();
	}

	private void btnSiguienteActionPerformed(java.awt.event.ActionEvent evt) {
		if (pasoActivo.ejecutar()) {
		iterarPasos(new IteradorPasos() { public Paso iterar() { 
			Paso next = iteradorPasos.next();
			return next == pasoActivo
					? iteradorPasos.next()
							: next ; } });
		}
	}
	
	private void btnAnteriorActionPerformed(java.awt.event.ActionEvent evt) {
		iterarPasos(new IteradorPasos() { public Paso iterar() {
			Paso previous = iteradorPasos.previous();
			return previous == pasoActivo
					? iteradorPasos.previous()
							: previous; } });
	}

	private void iterarPasos(IteradorPasos iterador) {
		pasoActivo.setVisible(false);
		
		{ 
			pasoActivo = iterador.iterar(); 
		} while (!pasoActivo.estaActivo());
		
		pasoActivo.inicializar();
		pasoActivo.setVisible(true);
		btnAnterior.setVisible(pasoActivo.tieneAnterior());
		btnSiguiente.setVisible(pasoActivo.tieneSiguiente());
	}
	
	interface IteradorPasos {
	    Paso iterar();
	}

	public void reiniciar() {
		Controlador.getInstance().limpiar();
		for(Paso paso : pasos) { paso.limpiar(); }
		iteradorPasos = (ListIterator<Paso>) pasos.iterator();
		pasoActivo.setVisible(false);
		pasoActivo = iteradorPasos.next();
		pasoActivo.setVisible(true);
		btnAnterior.setVisible(pasoActivo.tieneAnterior());
		btnSiguiente.setVisible(pasoActivo.tieneSiguiente());
	}
}